/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package csp;

/**
 *
 * @author Leandro
 */
public class ExpertoRestriccionesAntena extends ExpertoRestricciones{

    private double potencia;

    public double getPotencia() {
        return potencia;
    }

    public ExpertoRestriccionesAntena(double potencia){
    this.potencia=potencia;
    }

    @Override
    /*public boolean factible(CSP problema) {
        
       return super.factible(problema);
    }*/

   // @Override
    public boolean verificarRestricciones(Variable var) {
        UbicacionAntena ubic=(UbicacionAntena)var;
        return verificarFrecuencia(ubic) && verificarPotencia(ubic);
    }

    private boolean verificarFrecuencia(UbicacionAntena u){
        boolean rta=true;
        Antena a=(Antena) u.getAsignado();
        Antena aux;
        for(UbicacionAntena consecutivo:u.getConsecutivas()){
            aux=(Antena) consecutivo.getAsignado();
            if (aux != null && a != null){
            if(a.getFrecuencia()== aux.getFrecuencia()){
            rta=false;
            }
            }
        }
        return rta;
    }

    private boolean verificarPotencia(UbicacionAntena ubic) {
         boolean rta=true;
         Antena a=(Antena) ubic.getAsignado();
         Antena aux;
         for(UbicacionAntena consecutivo:ubic.getConsecutivas()){
            aux=(Antena) consecutivo.getAsignado();
            if (aux !=null && a != null){
            if((a.getPotencia() + aux.getPotencia())>potencia){
            rta=false;
            }
            }
         }
         for(UbicacionAntena visible:ubic.getVisibles()){
            aux=(Antena) visible.getAsignado();
            if(aux != null && a != null){
            if((a.getPotencia() + aux.getPotencia())>potencia){
            rta=false;
            }
            }
         }
         return rta;
    }

    public boolean verificarValor(Variable xi, Valor valorI, Variable xj) {
//        Antena valorPrevio=(Antena) xi.getAsignado();
//        xi.setAsignado(valorI);
        boolean rta=false;
        boolean restP=false;
        boolean restF=true;



        UbicacionAntena uxi,uxj;
        uxi=(UbicacionAntena)xi;
        uxj=(UbicacionAntena)xj;
        Antena antenaI,antenaJ;
        antenaI=(Antena) valorI;
        //Verificar si es consecutiva
        boolean esConsec;
        esConsec=false;
        for(UbicacionAntena consec:uxi.getConsecutivas()){
            //verificar que esto sirva
            if(consec.equals(uxj)){
            esConsec=true;
            restF=false;
            break;
            }
        }

        //Caso especial de que la variable objetivo xj este asignada
        if(xj.getAsignado()!=null){
            Antena vj=(Antena) xj.getAsignado();
            Antena vi=(Antena) valorI;
            if(vi.getPotencia()+vj.getPotencia()>this.potencia){
            return false;
            }
            if(esConsec && (vi.getFrecuencia()==vj.getFrecuencia())){
            return false;
            }
        }


        //Verificar la potencia
        for(Valor v:uxj.getValoresPosibles()){
            //Reinicializar Variables
            restP=false;
            if(esConsec) restF=false;
            
             antenaJ=(Antena)v;
            //antenaI=(Antena)uxi.getAsignado();
            if((antenaI.getPotencia()+ antenaJ.getPotencia())<= this.potencia){
                restP=true;
                //break;
            }
              if(esConsec){
              //Verificar la frecuencia
                    if(antenaI.getFrecuencia()!= antenaJ.getFrecuencia()){
                        restF = true;
                    }
              }
             if(restF && restP){
             break;
             }
        }
        if(restF && restP){
        rta=true;
        }else{
         if(uxj.getAsignado()!=null){
            rta=true;
         }
        }

        return rta;
    }


}
